#include <functional>

int f(int a, int b)
{
    return a + b;
}

class functor
{
public:
    int operator()(int a, int b)
    {
        return a + b;
    }
};

class Plus
{
public:
    static int plusI(int a, int b)
    {
        return a + b;
    }
    double plusD(double a, double b)
    {
        return a + b;
    }
};
int main()
{
    // 包装函数指针（函数名）
    std::function<int(int, int)> func1 = f;

    // 包装函数对象（仿函数）
    std::function<int(int, int)> func2 = functor();

    // 包装lambda表达式
    std::function<int(int, int)> func3 = [](int a, int b){ return a + b; };

    // 包装类的静态成员函数
    std::function<int(int, int)> func4 = &Plus::plusI; // &可忽略

    // 包装类的非静态成员函数（非静态函数第一个隐藏参数是this指针，所以要指明类的类型）
    std::function<double(Plus, double, double)> func5 = &Plus::plusD; // &不可忽略
    return 0;
}